<?php
/**
 * Api公共类
 * Interface引用api模式，没有display等view的渲染和页面模版输出
 */

namespace Common\Common;
use Think\Controller;

class AliPay extends Controller
{
    var $aop;

    /**
     * 初始化
     */
    public function __construct()
    {
        parent::__construct();
        //支付宝支付
        vendor('Alipay.aop.AopClient');
        $this->aop = new \AopClient();
        $this->aop->gatewayUrl = C('ALIPAY')['gatewayUrl'];
        $this->aop->appId = C('ALIPAY')['app_id'];
        $this->aop->rsaPrivateKey = C('ALIPAY')['merchant_private_key'];//私有密钥
        $this->aop->format = "JSON";
        $this->aop->charset = "utf-8";
        $this->aop->signType = "RSA2";
        $this->aop->alipayrsaPublicKey = C('ALIPAY')['alipay_public_key'];//公有密钥
    }

    /**
     * 创建APP支付订单
     * @param string $body 对一笔交易的具体描述信息。
     * @param string $subject 商品的标题/交易标题/订单标题/订单关键字等。
     * @param string $order_sn 商户网站唯一订单号
     * @return array 返回订单信息
     */
    public function tradeAppPay($userid, $out_trade_no, $money, $add_ip, $create_time, $remark, $paytype)
    {
        vendor('Alipay.aop.request.AlipayTradeAppPayRequest');
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.app.pay
        $request = new \AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数，这里只需要传入业务参数
        $bizcontent = [
            'userid' => $userid,
            'out_trade_no' => $out_trade_no,
            'money' => $money,
            'add_ip' => $add_ip,//失效时间为 1天
            'create_time' => $create_time,//价格
            'remark' => $remark,
            'paytype' => $paytype,
        ];
        //商户外网可以访问的异步地址 (异步回掉地址，根据自己需求写)
        $request->setNotifyUrl(C('ALIPAY')['notify_url']);
        $request->setBizContent(json_encode($bizcontent));
        //这里和普通的接口调用不同，使用的是sdkExecute
        $response = $this->aop->sdkExecute($request);
        return $response;
        //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义，实际打印到日志以及http传输不会有这个问题
    }


    /**
     * 异步通知验签
     *
     * @param string $params 参数
     * @param string $signType 签名类型：默认RSA
     * @return bool 是否通过
     */
    public function rsaCheck($params, $signType)
    {
        return $this->aop->rsaCheckV1($params, NULL, $signType);
    }
}